#include <stdio.h>
#include <stdlib.h>

#include "carte_zone.h"
#include "manipulation_cases.h"

#include "constantes_et_macros.h"









void set_dim_carte_zone(struct carte_zone* carte, const unsigned int x, const unsigned int y)
{
    carte->dim_x = x;
    carte->dim_y = y;
}



char est_dans_carte(const int x, const int y, const struct carte_zone* carte)
{
    if(x < 0 || y < 0 || x >= carte->dim_x || y >= carte->dim_y)
        return FAUX;
    else
        return VRAI;
}



void init_carte_zone(struct carte_zone* carte, unsigned int x, unsigned int y)
{
    unsigned int i;

    set_dim_carte_zone(carte, x, y);

    if(!(carte->grille_cases_constantes =
            (unsigned char*)malloc
            (x * y * sizeof(unsigned char))))
        exit(EXIT_MALLOC);

    if(!(carte->grille_cases_destructibles =
            (struct case_destructible**)malloc
            (x * y * sizeof(struct case_destructible*))))
        exit(EXIT_MALLOC);

    for(i = 0;  i < x * y;  i++)
        carte->grille_cases_destructibles[i] = NULL;
    /*
     * la somme d'argent par defaut est 0. Il est ensuite facultatif de
     * preciser une somme nulle dans la description d'une zone
     */
    carte->argent_zone = 0;
    /* pour la meme raison que pour l'argent, boss est mis a FAUX par defaut */
    carte->boss = FAUX;
    carte->deja_visitee = FAUX;
}


void detruire_carte_zone(struct carte_zone* carte)
{
    unsigned int i;

    /*
     * on verifie que les pointeurs ne soient pas NULL
     * avant de les liberer
     */
    if(carte->grille_cases_constantes)
        free(carte->grille_cases_constantes);
    for(i = 0;  i < carte->dim_x * carte->dim_y;  i++)
        if(carte->grille_cases_destructibles[i])
            free(carte->grille_cases_destructibles[i]);
    if(carte->grille_cases_destructibles)
        free(carte->grille_cases_destructibles);
    detruire_tab_dyn_cases_constantes(&(carte->liste_infos_cases_constantes));
    detruire_tab_dyn_id(&carte->tab_objets_zone);
    detruire_tab_dyn_id(&carte->liste_id_ennemis);
}




void mettre_contour_et_remplir(struct carte_zone* carte)
{
    int i, j;

    /* mise en place du mur d'enceinte */
    /* lignes horizontales tout en haut et tout en bas de la carte) */
    for(j = 0;  j < carte->dim_y;  j += carte->dim_y - 1)
        for(i = 0;  i < carte->dim_x;  i++)
            set_case_constante_grille(carte, 1, i, j);

    /* lignes verticales (a droite et a gauche) */
    for(i = 0;  i < carte->dim_x;  i += carte->dim_x - 1)
        for(j = 1;  j < carte->dim_y - 1;  j++)
            set_case_constante_grille(carte, 1, i, j);

    /* remplissage */
    for(j = 1;  j < carte->dim_y - 1;  j++)
        for(i = 1;  i < carte->dim_x - 1;  i++)
            set_case_constante_grille(carte, 0, i, j);
}









